package com.hspedu.qqclient.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;

import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;

/**
 * @author 吴宇~
 * @motto 我亦无他，唯手熟尔。
 * @edition jdk1.8
 * @reflection 0-1 喧闹任其喧闹，自由我自为之，我自风情万种，与世无争。
 * @date 2023/03/20/16:55
 */
public class ClientConnectServerThread extends Thread {
    //该线程需要持有Socket
    private Socket socket;

    /**
     * @Description: TODO
     * @author: WY
     * @Return: 构造器可以接受一个Socket对象
     */
    public ClientConnectServerThread(Socket socket) {
        this.socket = socket;
    }
    //为了更方便的得到Socket方法

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        //这个线程是为了在后台一直和服务器保持运行，一直做成一个while循环
        while (true) {
            //一直读取从服务器读取的消息
//            System.out.println("客户端的线程，等待从服务器端发送的消息");
            try {
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();//如果服务器没有发送Message对象。线程会阻塞在这里

                //我们判断message的类型。做相应的业务处理,如果它是读取到的是服务端的好友在线列表，否则
                if (message.getMesType().equals(MessageType.MESSAGE_RET_ONLINE_FRIEND)) {
                    //取出在线列表信息。`
                    //做一个规定。空格隔开的是一个数据
                    String[] online = message.getContent().split(" ");
                    //当前在线用户如下
                    /**
                     *
                     */
                    System.out.println("\n=============当前在线用户列表=============");
                    for (int i = 0; i < online.length; i++) {
                        System.out.println("用户：" + online[i]);
                    }
                }else if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)){//提供接收到的是普通放入聊天消息的类型
                    //把服务器端接收到的消息，显示到控制台
                    System.out.println("\n"+message.getSender()+"对我说："+message.getContent()+"        "+message.getSendTime());

                }else if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL_MES)){
                    System.out.println("\n（群发）"+message.getSender()+"说："+message.getContent());

                }else if (message.getMesType().equals(MessageType.MESSAGE_FILE_MES)){
                    //如果接收到一个文件
                    System.out.println("\n"+message.getSender()+"我发送了一个文件到"+message.getDest());
                    //取出文件的字节数组，通过文件输出流写入到磁盘中，
                    FileOutputStream fileOutputStream = new FileOutputStream(message.getDest());
                    fileOutputStream.write(message.getFillBytes());
                    //在这儿就得关流，上面的读取文件为什么不关流？因为是Object？
                    fileOutputStream.close();
                    System.out.println("\n保存文件成功~");
                    System.out.println("真无语了，直接甩磁盘了");
                }
                else {
                    System.out.println("其他类型的message，暂时不处理");
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
